/*
 * Atributotipo.java
 *
 * Created on 11 de agosto de 2003, 07:13 PM
 */

package Modelo;

/**
 *
 * @author  jreinoso
 */
import java.util.*;
public class AtributoTipo {
    
    public String atributo;  //nombre de la columna en BD formato.
    public String tipo ;     // tipo del atributo.
    public String aliasTabla;  // usado solo por las VISTAS. indica el alias de la tabla dueña de la columna (atributo)
    public boolean obligatoriedad;
    
    /** Creates a new instance of Atributotipo */
    public AtributoTipo(String pAtributo, String pTipo, boolean p_obligatoriedad) {
        atributo = pAtributo;
        tipo = pTipo;
        obligatoriedad = p_obligatoriedad;
        aliasTabla = "";
    }
    public AtributoTipo(String pAtributo, String pTipo,boolean p_obligatoriedad, String pAliasTabla) {
        atributo = pAtributo;
        tipo = pTipo;
        obligatoriedad = p_obligatoriedad;
        aliasTabla = pAliasTabla;
    }
    
    public String getAtributo(){ return this.atributo; }
    public String getTipo(){ return this.tipo; }
    public boolean getObligatoriedad(){ return this.obligatoriedad; }
    public String getMetodo(){ return this.aliasTabla;}
    
    public void setAtributo(String pAtributo){ this.atributo = pAtributo;}
    public void setTipo(String pTipo){ this.tipo = pTipo;}
     public void setObligatoriedad(boolean pObligatoriedad){ this.obligatoriedad = pObligatoriedad;}
    public void setAliasTabla(String pAliasTabla) { this.aliasTabla = pAliasTabla;}
    
    // Dado un valor, lo retorna en un formato apto para ser colocado
    // en una condicion acorde al tipo de dato pasado (Ej. colocarle comillas, dentro de un to_date, etc..
    public String getValorParaCondicion(String pValor){
        String retornar=null;
        
        if(pValor.equals("")){
            return "null";
        }
        
        if (this.tipo.equals("N")){  
            retornar=pValor; 
        }
        else if (this.tipo.equals("S")){  
            retornar="'"+pValor+"'";
        }
        else if (this.tipo.equals("D")){  
            if ((pValor!=null)&&(pValor.length()>0)&&(!pValor.equals("null"))){
                retornar="to_date('"+pValor+"','mm/dd/yyyy')";
            }else{
                retornar="null";
            }
            
        }
        else retornar = pValor;
        
        return retornar;
    }
    
    // Retorna el atributo en un formato apto para ser colocado en una condicion select.
    // acorde al tipo de dato.  Solo aplica para date, en donde se tiene que usar un to_char
    public String getAtributoParaSelect(){
        String retornar=null;
        String elAlias = this.getMetodo();
        if (!elAlias.equals("")){
            elAlias+=".";
        }            

        if (this.tipo.equals("D")){  retornar="to_char("+elAlias+this.getAtributo()+",'mm/dd/yyyy') "+this.getAtributo();}
        else retornar = this.getAtributo();
        
        return retornar;
    }
    
     // Retorna el atributo en un formato apto para ser colocado en una condicion order by.
    // acorde al tipo de dato.  Solo aplica para date, en donde se tiene que usar un to_char
    public String getAtributoParaOrderBy(){
        String retornar=null;
         String elAlias = this.getMetodo();
        if (!elAlias.equals("")){
            elAlias+=".";
        }            

        retornar = elAlias+this.getAtributo();
        
        return retornar;
    }
    
    // Para la clase vista tenemos un problema,  y es que a ella se pasa como dato
    // de entrada un query (y no la informacion del metamodelo como si pasa en Tabla).
    // esto significa que no es posible aplicar el getAtributoParaSelect.  El problema
    // radica es con los tipo date, que el getFilaByPK de Vista retorna en formato
    // mm/dd/yyyy hh:mm:ss y deberia hacerlo sin hh:mm:ss.
    
   public static String getDate(String vFecha) throws Exception {
       // se asume que debe venir por lo menos dos caracteres '/'.  Entonces,
       // en ese caso se busca el segundo y se cuentan 4 caracteres y eso es lo que se retorna.  
       
       System.out.println("Genericas.AtributoTipo.getDate(): entro con valor vFecha = " + vFecha);
       // si viene nulo o vacio se retorna nulo o vacio
       if (vFecha==null) return vFecha;
       if (vFecha.length()==0) return vFecha;
       if (vFecha.equals("")) return vFecha;
       
             
       StringBuffer sb = new StringBuffer(vFecha);
       int cuantos=0;
       int posicion=-1;
       for(int i=0; i<vFecha.length(); i++){
           System.out.println("char["+i+"]="+sb.charAt(i));
           if (sb.charAt(i)=='/') cuantos++;
           if (cuantos==2){ 
               posicion = i;
               break;
           }
       }
       System.out.println("posicoin:" + posicion);
       if (posicion==-1) {
           throw new Exception("Genericas.AtributoTipo.getDate():  Error al tratar de convertir el valor " + vFecha + 
           " a una fecha de formato mm/dd/yyyy.");
       }
       
       return vFecha.substring(0,posicion+5);                     
   }
    
    
    public static void main(String[] args){
        AtributoTipo as = new AtributoTipo("as","S",false);
        AtributoTipo an = new AtributoTipo("an","N",true);
        AtributoTipo ad = new AtributoTipo("ad","D",false);
        AtributoTipo ax = new AtributoTipo("ax","X",true);                
        
        System.out.println("as:" + as.getValorParaCondicion("hola"));
        System.out.println("an:" + an.getValorParaCondicion("33"));
        System.out.println("ad:" + ad.getValorParaCondicion("12/12/2002"));
        System.out.println("ax:" + ax.getValorParaCondicion("hola"));
        
        System.out.println("as:" + as.getAtributoParaSelect());
        System.out.println("ad:" + ad.getAtributoParaSelect());
        System.out.println("an:" + an.getAtributoParaSelect());
        System.out.println("ax:" + ax.getAtributoParaSelect());
        
        System.out.println("Obligatoriedad as:" + as.getObligatoriedad());
        System.out.println("Obligatoriedad ad:" + ad.getObligatoriedad());
        System.out.println("Obligatoriedad an:" + an.getObligatoriedad());
        System.out.println("Obligatoriedad ax:" + ax.getObligatoriedad());
        
        try{
        System.out.println("getDate('12/31/2002 3:400)=" + AtributoTipo.getDate("12/31/2002 3:40"));
        }catch(Exception e){
            System.out.println("error:" + e);
        }
    }

    String getAliasTabla() {
        return aliasTabla;
    }
    
    
}
